package tt.dz.egobus.servicemanager.service;

import tt.dz.egobus.api.exception.ResponseException;
import tt.dz.egobus.servicemanager.business.distance.DefaultDistanceAlgorithm;
import tt.dz.egobus.servicemanager.business.distance.DistanceAlgorithm;
import tt.dz.egobus.servicemanager.business.distance.PointFilter;
import tt.dz.egobus.servicemanager.business.filter.BusinessCodeValidateFilter;
import tt.dz.egobus.servicemanager.business.key.DriverStatus;
import tt.dz.egobus.servicemanager.business.point.BusPoint;
import tt.dz.egobus.servicemanager.entities.DriverRegisterBusRelative;
import tt.dz.egobus.servicemanager.vo.BusinessFinishVo;

/**
 * @author Anson
 * @date 17-3-23
 * @name 业务工作的缓存处理
 * @since 1.0.2
 */
public interface BusinessWorkCacheService {


    /**
     * @param driverId 司机key
     * @author Anson
     * @date 17-3-27
     * @name 获取司机当前缓存状态
     * @since 1.0.3
     */
    DriverStatus getStatus(String driverId);

    /**
     * @param driverId 司机id
     * @author Anson
     * @date 17-3-23
     * @name
     * @since 1.0.2
     */
    void active(String driverId, int[] businessCodes);

    /**
     * @param driverId 司机id
     * @author Anson
     * @date 17-3-23
     * @name 下线的缓存处理
     * @since 1.0.2
     */
    void down(String driverId);

    /**
     * @param driverId 司机id
     * @param x
     * @param y
     * @author Anson
     * @date 17-3-23
     * @name 更新地理位置
     * @since 1.0.2
     */
    void updatePoint(String driverId, double x, double y);

    /**
     * @param x
     * @param y
     * @param maxDistanceLimit 非必须，当前限制最大距离单位m,米 (0:表示由系统限制,-1:表示不限制,>0表示限制)
     * @param status           非必须 查询当前状态,null,则全查询
     * @author Anson
     * @date 17-3-24
     * @name 获取当前坐标点下的可显示车点位置
     * @since 1.0.2
     */
    BusPoint[] filterMaxLength(double x, double y, double maxDistanceLimit,
                               DriverRegisterBusRelative.RelativeStatus status);

    /**
     * @param x
     * @param y
     * @param pointFilter 坐标过滤器
     * @param status      非必须 查询当前状态,null,则全查询
     * @author Anson
     * @date 17-3-24
     * @name 获取当前坐标点下的可显示车点位置
     * @since 1.0.2
     */
    BusPoint[] filterMaxLength(double x, double y, PointFilter pointFilter,
                               DriverRegisterBusRelative.RelativeStatus status);

    /**
     * @param x
     * @param y
     * @param businessCode 服务号
     *                     不同的服务号，发出处理不一样
     * @param algorithmId  逻辑算法id
     * @throws ResponseException 当前逻辑算法非法异常
     * @author Anson
     * @date 17-3-23
     * @name 获取最优队列, 获取某点下坐标最近点位置，并且进行了相关按照最近原则进行了排序
     * 这个具体实现方法{@link DefaultDistanceAlgorithm#bestQueue(PointFilter)} }，
     * 实现了对满足条件的司机坐标点进行筛选{@link DefaultDistanceAlgorithm#getFilter(PointFilter)}与排序
     * 当前采用了业务编码过滤器{@link BusinessCodeValidateFilter }
     * 其中司机队列的搜寻结果按照系统配置的最大距离控制
     * @see DistanceAlgorithm
     * @see DefaultDistanceAlgorithm
     * @since 1.0.2
     */
    BusPoint[] bestSearch(double x, double y, int businessCode, String algorithmId) throws ResponseException;


    /**
     * @param availableBusPoints 当前可用的司机坐标队列
     * @param x
     * @param y
     * @param algorithmId        逻辑算法id
     * @throws ResponseException 当前逻辑算法非法异常
     * @author Anson
     * @date 17-3-23
     * @name 获取最优队列, 获取某点下坐标最近点位置，并且进行了相关按照最近原则进行了排序
     * 这个具体实现方法{@link DefaultDistanceAlgorithm#bestQueue(PointFilter)} }，
     * 实现了对满足条件的司机坐标点进行筛选{@link DefaultDistanceAlgorithm#getFilter(PointFilter)}与排序
     * @see DistanceAlgorithm
     * @see DefaultDistanceAlgorithm
     * @since 1.0.2
     */
    BusPoint[] bestSearch(BusPoint[] availableBusPoints, double x, double y, String algorithmId) throws ResponseException;

    /**
     * @param availableBusPoints 当前可用的司机坐标队列
     * @param x
     * @param y
     * @param algorithmId        逻辑算法id
     * @param pointFilter        坐标过滤器
     * @throws ResponseException 当前逻辑算法非法异常
     * @author Anson
     * @date 17-3-23
     * @name 获取最优队列, 获取某点下坐标最近点位置，并且进行了相关按照最近原则进行了排序
     * 这个具体实现方法{@link DefaultDistanceAlgorithm#bestQueue(PointFilter)} }，
     * 实现了对满足条件的司机坐标点进行筛选{@link DefaultDistanceAlgorithm#getFilter(PointFilter)}与排序
     * @see DistanceAlgorithm
     * @see DefaultDistanceAlgorithm
     * @since 1.0.2
     */
    BusPoint[] bestSearch(BusPoint[] availableBusPoints, double x, double y, String algorithmId,
                          PointFilter pointFilter) throws ResponseException;

    /**
     * @param driverId
     * @author Anson
     * @date 17-3-23
     * @name 获取司机当前位置
     * @since 1.0.2
     */
    BusPoint getNowPoint(String driverId);

    /**
     * @param driverId 司机的id
     * @throws ResponseException 当前司机状态已经不是处于激活状态
     * @author Anson
     * @date 17-3-27
     * @name 修改司机状态激活-->开始状态
     * @since 1.0.3
     */
    boolean doDriverBeginBusiness(String driverId) throws ResponseException;

    /**
     * @param driverId 司机的id
     * @throws ResponseException 当前司机状态已经不是处于激活状态
     * @author Anson
     * @date 17-3-28
     * @name 司机确认用户身份之后的，接单开始-->更新当前司机的状态
     * @since 1.0.3
     */
    boolean doTask(String driverId) throws ResponseException;

    /**
     * @param finishVo 完成派单任务时候vo
     * @author Anson
     * @date 17-3-29
     * @name 司机确认完成派单
     * @since 1.0.3
     */
    boolean doFinish(BusinessFinishVo finishVo) throws ResponseException;

    /**
     * @param driverId 司机id
     * @author Anson
     * @date 17-3-29
     * @name 用户取消，则司机状态处理
     * @since 1.0.3
     */
    boolean doUserCancel(String driverId) throws ResponseException;

    /**
     * @param finishVo 当前行程的详细信息
     * @author Anson
     * @date 17-3-29
     * @name 验证当前有效的行程计算
     * @since 1.0.3
     */
    double validateDistance(BusinessFinishVo finishVo) throws ResponseException;

    /**
     * @param driverId 当前司机
     * @author Anson
     * @date 17-3-30
     * @name 处理司机当期那异常状态
     * @since 1.0.3
     */
    boolean doException(String driverId);


}
